import mqtt_module from 'mqtt'
import { Buffer } from 'buffer';
import { meshLog } from '../../config';
const Mqtt = function (url) {
    this.mqtt = mqtt_module
    this.random = getGuid32;
    this.clientId = getGuid32();
    const clientId = 'mqttjs_' + Math.random().toString(16).substr(2, 8)
    let options = {
        // clientId: this.clientId,
        username: '',
        password: '',
        // connectTimeout: 100,
        // keepalive: 100
        keepalive: 60,
        clientId: clientId,
        //protocolId: 'mqtts',
        protocolId: 'MQTT',
        protocolVersion: 4,
        clean: true,
        reconnectPeriod: 1000,
        connectTimeout: 30 * 1000,
        will: {
            topic: 'WillMsg',
            payload: 'Connection Closed abnormally..!',
            qos: 0,
            retain: false
        }
    }
    this.client = this.mqtt.connect("mqtt://" + url + "/mqtt", options)
    // 重连次数 超5次就算了
    this.reconnectNum = 0
    // 连接
    this.link = function () {
        return new Promise((resolve, reject) => {
            this.client.on('connect', e => {
                meshLog('---mqtt链接成功---')
                resolve(this.client)
            })
            this.client.on('reconnect', error => {
                this.reconnectNum++
                if (this.reconnectNum >= 10) this.client.end(true)
                meshLog('正在重连:', error)
            })
            this.client.on('error', error => {
                meshLog('订阅失败', error)
            })
        })
    }
    this.subscribe = function (topic, options) {
        this.client.subscribe(topic, options, (err) => {
            if (!err) {
                meshLog('---' + topic + '订阅成功---')
            } else {
                throw new Error(err)
            }
        })
    }
    this.publish = function (topic, sendMsg, options) {
        this.client.publish(topic, JSON.stringify(sendMsg), options, (err, a) => {
            if (!err) {
                meshLog('-----------' + topic + '发送成功---------------')
            } else {
                throw new Error(err)
            }
        })
    }
    this.message = function (callback) {
        this.client.on('message', (topic, message) => {
            let data = message.toString();
            //meshLog(message.toString());
            callback(data, topic)
        })
    }
    // 关闭
    this.close = function () {
        meshLog('---关闭mqtt--------')
        this.client.end(true)
    }
}
export default Mqtt
function getGuid32() {
    var rt_str = String.fromCharCode(65 + Math.floor(Math.random() * 26));
    for (var i = 0; i < 31; ++i) {
        var num = Math.floor(Math.random() * (26 + 26 + 10));
        var ch_str;
        if (num < 10) {
            ch_str = num.toString();
        } else if (num < 10 + 26) {
            ch_str = String.fromCharCode(65 + num - 10);
        } else {
            ch_str = String.fromCharCode(97 + num - 10 - 26);
        }
        rt_str += ch_str;
    }
    return rt_str;
}
